<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 普通函数
    // String()  Number()   Boolean()    Array()   Object()

    // 构造函数
    // new String()  new Number()   new Boolean()    new Array()   new Object()
    // var arr = new Array();
    // console.log(arr);

    // var p = new Promise(() => { });
    // console.log(p);

    // 构造函数本质也是一个函数,但是通过new关键让它和普通函数出现了明显的区别


    // new 关键词做了什么操作?
    // 1. 在函数内部创建一个纯净的空对象  {} (构造函数内部创建的  this instanceof fn => true)
    // 2. 强制将this指向创建空对象   this -> {}   
    // 3. 给创建的实例化对象绑定了一个 私有属性[[prototype]]  指向构造函数的原型对象 
    //    可以理解为 this.[[prototype]] = fn.prototype  (方便理解 不能直接这么写)
    //     老版本    this.__proto__ = fn.prototype
    // 4. 默认返回创建的实例化对象   return this;

    // 构造函数中的this指向: 构造函数的this指向  构造函数在执行过程中创建的实例化对象
    // 注意:为了区分普通函数  和 构造函数  要求构造函数的首字母大写

    /*  function fn() {
         console.log(this);
     }
     // 作为普通函数调用
     var result = fn(); // this -> window
     console.log(result); */



    /* function fn() {
        // {}
        // this -> {}
        console.log("函数内的this:", this, this instanceof fn);

        // return this;
    }
    // 作为构造函数调用
    // 调用构造函数 创建一个实例化对象 => 赋值给变量result
    var result = new fn(); //
    console.log("返回值:", result);
 */



    function Person(name, age) {
        // {}
        // this -> {}
        // console.log("函数内的this:", this, this instanceof fn);

        // 把相关的属性和方法 存储到实例化对象上
        this.name = name;
        this.age = age;

        // return this;
    }

    var zhang = new Person("张三", 18);
    console.log(zhang, zhang instanceof Person);
    var liSi = new Person("李四", 25);
    console.log(liSi, liSi instanceof Person);








</script>

</html>